Skill Gap Analysis

Personal Skills Assessment: Mishal & Almas

Program: Applied Business Analytics, Boston University

This analysis compares our current skill levels against the market demand identified in our Exploratory Data Analysi of job postings from the lightcast dataset. The goal is to identify skill gaps and prioritize learning areas for career readiness.

Code
import pandas as pd
import numpy as np
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import plotly.express as px
import plotly.io as pio
pio.renderers.default = "plotly_mimetype+notebook"


market_demand = {
    'Data Analysis': 76,
    'SQL': 52,
    'Python': 32,
    'Tableau': 31,
    'Communication': 43,
    'Excel': 28,
    'Statistics': 25,
    'Power BI': 22,
    'Machine Learning': 18,
    'R': 15,
    'Project Management': 20,
    'Business Intelligence': 35
}


mishal_skills = {
    'Data Analysis': 55,
    'SQL': 30,
    'Python': 70,
    'Tableau': 70,
    'Communication': 70,
    'Excel': 55,
    'Statistics': 50,
    'Power BI': 75,
    'Machine Learning': 30,
    'R': 25,
    'Project Management': 30,
    'Business Intelligence': 60
}

almas_skills = {
    'Data Analysis': 70,
    'SQL': 50,
    'Python': 60,
    'Tableau': 0,
    'Communication': 60,
    'Excel': 80,
    'Statistics': 60,
    'Power BI': 70,
    'Machine Learning': 50,
    'R': 55,
    'Project Management': 20,
    'Business Intelligence': 60
}

skills_df = pd.DataFrame({
    'Skill': list(market_demand.keys()),
    'Market_Demand': list(market_demand.values()),
    'Mishal': [mishal_skills[s] for s in market_demand.keys()],
    'Almas': [almas_skills[s] for s in market_demand.keys()]
})

skills_df['Mishal_Gap'] = skills_df['Mishal'] - skills_df['Market_Demand']
skills_df['Almas_Gap'] = skills_df['Almas'] - skills_df['Market_Demand']

Visualization 1: Skill Comparison Radar Chart

This radar chart compares our individual skill levels against market demand, helping visualize strengths and areas for improvement.

Code


skills = skills_df['Skill'].tolist()
skills_closed = skills + [skills[0]]  

market_values = skills_df['Market_Demand'].tolist() + [skills_df['Market_Demand'].tolist()[0]]
mishal_values = skills_df['Mishal'].tolist() + [skills_df['Mishal'].tolist()[0]]
almas_values = skills_df['Almas'].tolist() + [skills_df['Almas'].tolist()[0]]

fig1 = go.Figure()

fig1.add_trace(go.Scatterpolar(
    r=market_values,
    theta=skills_closed,
    fill='toself',
    name='πŸ“ˆ Market Demand',
    line=dict(color='#636EFA', width=3),
    fillcolor='rgba(99, 110, 250, 0.15)',
    opacity=0.9
))

fig1.add_trace(go.Scatterpolar(
    r=mishal_values,
    theta=skills_closed,
    fill='toself',
    name='πŸ‘©β€πŸ’» Mishal',
    line=dict(color='#EF553B', width=2.5),
    fillcolor='rgba(239, 85, 59, 0.2)',
    opacity=0.85
))

fig1.add_trace(go.Scatterpolar(
    r=almas_values,
    theta=skills_closed,
    fill='toself',
    name='πŸ‘¨β€πŸ’» Almas',
    line=dict(color='#00CC96', width=2.5),
    fillcolor='rgba(0, 204, 150, 0.2)',
    opacity=0.85
))

fig1.update_layout(
    polar=dict(
        radialaxis=dict(
            visible=True,
            range=[0, 100],
            tickfont=dict(size=10, color='#666'),
            gridcolor='rgba(0,0,0,0.1)',
            linecolor='rgba(0,0,0,0.1)'
        ),
        angularaxis=dict(
            tickfont=dict(size=11, color='#333', family='Arial'),
            gridcolor='rgba(0,0,0,0.08)',
            linecolor='rgba(0,0,0,0.1)',
            rotation=90,
            direction='clockwise'
        ),
        bgcolor='rgba(250,250,250,0.5)'
    ),
    title=dict(
        text='<b>Skill Proficiency vs Market Demand</b><br><sup>Mishal & Almas | BU Applied Business Analytics</sup>',
        font=dict(size=18, color='#2c3e50', family='Arial Black'),
        x=0.5,
        y=0.95
    ),
    legend=dict(
        orientation='h',
        yanchor='bottom',
        y=-0.15,
        xanchor='center',
        x=0.5,
        font=dict(size=12),
        bgcolor='rgba(255,255,255,0.8)',
        bordercolor='rgba(0,0,0,0.1)',
        borderwidth=1
    ),
    template='plotly_white',
    height=650,
    width=800,
    margin=dict(t=100, b=80, l=80, r=80)
)

fig1.write_image('figures/skill_gap_radar.png', scale=2)
fig1.show()
print("πŸ“Š Skill Gap Analysis Summary")
print("-" * 50)
print(skills_df.to_string(index=False))
πŸ“Š Skill Gap Analysis Summary
--------------------------------------------------
                Skill  Market_Demand  Mishal  Almas  Mishal_Gap  Almas_Gap
        Data Analysis             76      55     70         -21         -6
                  SQL             52      30     50         -22         -2
               Python             32      70     60          38         28
              Tableau             31      70      0          39        -31
        Communication             43      70     60          27         17
                Excel             28      55     80          27         52
           Statistics             25      50     60          25         35
             Power BI             22      75     70          53         48
     Machine Learning             18      30     50          12         32
                    R             15      25     55          10         40
   Project Management             20      30     20          10          0
Business Intelligence             35      60     60          25         25

Visualization 2: Skill Gap Heatmap Table

This heatmap provides a detailed breakdown of each skill, showing market demand alongside our proficiency levels and highlighting specific gaps to address.

Code

skills_sorted = skills_df.sort_values('Market_Demand', ascending=False).reset_index(drop=True)

def get_status(gap):
    if gap >= 10:
        return 'βœ… Strong'
    elif gap >= -10:
        return '⚑ On Track'
    else:
        return '🎯 Focus Area'

skills_sorted['Mishal_Status'] = skills_sorted['Mishal_Gap'].apply(get_status)
skills_sorted['Almas_Status'] = skills_sorted['Almas_Gap'].apply(get_status)

fig2 = go.Figure()

headers = ['<b>Skill</b>', '<b>Market<br>Demand</b>', 
           '<b>Mishal<br>Level</b>', '<b>Mishal<br>Status</b>',
           '<b>Almas<br>Level</b>', '<b>Almas<br>Status</b>']

def get_cell_color(status):
    if 'βœ…' in status:
        return 'rgba(0, 204, 150, 0.3)'
    elif '⚑' in status:
        return 'rgba(255, 193, 7, 0.3)'
    else:
        return 'rgba(239, 85, 59, 0.25)'

mishal_colors = [get_cell_color(s) for s in skills_sorted['Mishal_Status']]
almas_colors = [get_cell_color(s) for s in skills_sorted['Almas_Status']]

cell_colors = [
    ['rgba(248, 249, 250, 0.8)'] * len(skills_sorted),  
    ['rgba(99, 110, 250, 0.15)'] * len(skills_sorted),   
    ['rgba(239, 85, 59, 0.1)'] * len(skills_sorted),     
    mishal_colors,                                         
    ['rgba(0, 204, 150, 0.1)'] * len(skills_sorted),     
    almas_colors                                           
]

fig2.add_trace(go.Table(
    header=dict(
        values=headers,
        fill_color='#2c3e50',
        font=dict(color='white', size=13, family='Arial'),
        align='center',
        height=45,
        line=dict(color='white', width=2)
    ),
    cells=dict(
        values=[
            skills_sorted['Skill'],
            [f"{v}%" for v in skills_sorted['Market_Demand']],
            [f"{v}%" for v in skills_sorted['Mishal']],
            skills_sorted['Mishal_Status'],
            [f"{v}%" for v in skills_sorted['Almas']],
            skills_sorted['Almas_Status']
        ],
        fill_color=cell_colors,
        font=dict(color='#2c3e50', size=12, family='Arial'),
        align=['left', 'center', 'center', 'center', 'center', 'center'],
        height=35,
        line=dict(color='rgba(0,0,0,0.1)', width=1)
    )
))

fig2.update_layout(
    title=dict(
        text='<b>Skill Gap Analysis Dashboard</b><br><sup>🎯 Focus Area | ⚑ On Track | βœ… Strong</sup>',
        font=dict(size=18, color='#2c3e50', family='Arial Black'),
        x=0.5,
        y=0.98
    ),
    height=550,
    width=900,
    margin=dict(t=80, b=20, l=20, r=20),
    paper_bgcolor='white'
)

fig2.write_image('figures/skill_gap_table.png', scale=2)
fig2.show()

Conclusion

Based on our analysis of 20,000+ job postings and our personal skill assessments:

Mishal’s Profile: - Strengths: Power BI (75%), Python (70%), Tableau (70%), Communication (70%) - exceeds market demand in visualization and programming - Focus Areas: Data Analysis (55% vs 76% demand), SQL (30% vs 52% demand) - Strong visualization toolkit but needs to strengthen core data analysis and database querying skills

Almas’s Profile:
- Strengths: Excel (80%), Data Analysis (70%), Power BI (70%) β€” solid foundation in spreadsheet and BI tools - Focus Areas: Tableau (0% - not yet learned), Project Management (20% vs 20% demand), SQL (50% vs 52% demand) - Excellent Excel skills; should prioritize learning Tableau to complete the visualization skillset

Team Synergy: - Mishal brings stronger Python programming and visualization expertise - Almas brings superior Excel, R, and Data Analysis capabilities - Together, we try to help each other out in bringing good results for the project.


Analysis conducted as part of AD688 CLOUD ANALYTICS FOR BUSINESS - Applied Business Analytics at Boston University